import { def } from './utils.js';
const arrayPrototype = Array.prototype;
//以Array.prototype为原型，创建arrayMethods对象
// 针对数组形成响应式，需要改写数组的七种方法
// push
// pop
// shift
// unshift
// splice
// sort
// reverse
export const arrayMethods = Object.create(arrayPrototype);

// Object.setPrototypeOf(o,arrayMethods);
// o.__proto__=arrayMethods;

const methodsNeedChange = [
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sort',
    'reverse'];
methodsNeedChange.forEach(methodName => {
    //备份原来的方法
    const original = arrayPrototype[methodName];
    //定义新的方法
    def(arrayMethods, methodName, function () {
        //把类数组对象变为数组,不然下面的slice无法调用
        const args=[...arguments];
        //把这个数组身上的__ob__取出来，__ob__已经被添加了，为什么已经被添加了？因为数组肯定不是最高层
        //比如obj.g属性是数组，obj不能是数组，第一次遍历obj这个对象的第一层的时候，已经给g属性，添加了__ob__属性
        const ob = this.__ob__;

        // 'push',
        // 'unshift',
        // 'splice',
        //这三者涉及插入新项，所以也需要变成observe
        let inserted = [];
        switch (methodName) {
            case 'push':
            case 'unshift':
                inserted = args;
                break;
            case 'splice':
                inserted = args.slice(2);
                break;
        }
        //判断有没有需要插入新项,让新项变成响应的
        if (inserted) {
            ob.observeArray(inserted);
        }
        //此处this是被数组打点调用的，而且不能用箭头函数
        original.apply(this, arguments);
        ob.dep.notify();
    }, false);
})